package kz.pompei.ifacer.grot.acts;

public abstract class Act {
  Act next;
  Act prev;
  
  public abstract void apply(GrotStorage storage) throws Exception;
  
  public abstract void cancel(GrotStorage storage) throws Exception;
  
  public boolean canMerge(Act act) throws Exception {
    return false;
  }
  
  /**
   * Производит мержинг в этот и примение различий. Предполагается что этот
   * (this) акт уже исполнен.
   * 
   * @param act
   *          акт-различие, который примержиться к этому
   * @param storage
   *          объект, к которому применяются различия
   */
  public void mergeAndApply(Act act, GrotStorage storage) throws Exception {
    throw new IllegalStateException("You cannot do it");
  }
}
